/**
 * 事件表
 */
#pragma once

#include "EventObject.h"
#include "EventString.h"
#include "EventType.h"

#include <time.h>

typedef struct _EventItem EventItem;
#define EVENT_ITEM(any) ((EventItem *)any)
struct _EventItem
{
	EventObject parent_instance;
	euint32	    event_id;

	/* 创建该条目的用户 ID */
	euint32 create_uid;

	/* 创建该条目的日期时间 */
	time_t create_time;

	/* 修改该条目的日期时间 */
	time_t modify_time;

	/* 该事件的截止时间 */
	time_t end_time;

	/* 事件名 */
	EventString *event_name;

	/* 事件描述 */
	EventString *event_describe;

	/* 是否为重要事件 */
	bool is_important;
};

/* 事件条目表对象 */
typedef struct _EventTable EventTable;
#define EVENT_TABLE(any) ((EventTable *)any)

extern EventTable *event_table_new(void);

/**
 * 设置一条事件到事件表，若不存在则创建，已存在则修改
 * 请注意，本 add_event 方法将会自动引用 EventString 对象！
 * @param event_id 事件条目 EventID；
 *                 若为   0 则创建新条目；
 *                 若不为 0 且未找到事件条目则出错。
 * @param user_id  添加该条目的用户 UserID
 *
 * @return 返回设置或修改的 EventID，出错则为 0
 */
extern euint32 event_table_set_event(EventTable *self, euint32 event_id,
				     euint32 user_id, time_t end_time,
				     EventString *event_name,
				     EventString *event_describe,
				     bool	  is_important);

/**
 * @brief 从事件表中删除一条事件
 * @return 0: 成功，1. 空对象错误，2. 无该事件条目
 */
extern int event_table_remove_event(EventTable *self, euint32 event_id);

/**
 * @brief 重置事件表的迭代方法
 */
extern void event_table_iter_reset(EventTable *self);

/**
 * @brief 迭代一条事件条目
 */
extern EventItem *event_table_iter_get(EventTable *self);

/**
 * 打印事件表
 */
extern void __event_table_print(EventTable *self);
